#include <iostream>
#include <vector>
#include <stack>
using  namespace  std;
//假设图是连通的

vector< vector<int> >v; //表示邻接表
const int maxsize=100;
int visited[maxsize];//0 1 2 表示三种状态 0未访问 1正在访问 2已经访问完   1-1 说明有环
stack<int>s;

//
void   dfs(int u) {
    if (!visited[u]) {
        visited[u] = 1;
        for (int i = 0; i < v[u].size(); ++i) {
            if (!visited[v[u][i]] ) {
                dfs(v[u][i]);
            }
        }
        s.push(u);
    }
}
int main() {

    //初始化有向图
    int m,n;
    v.resize(100);

    cin>>m>>n;//边树和顶点树

    for(int i=0;i<n;++i)
    {
        visited[i]=0;
    }
    for (int i = 0; i < m; ++i) {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
    }
    //dfs求逆拓扑排序
    dfs(0);
    while (!s.empty())
    {
        cout<<s.top()<<" ";
        s.pop();
    }




    return 0;
}
